
/**
 * @info    (Deze klasse tbv. kantine simulatie regelt dynamische event handeling)
 * @author  (Veenstra Stephan, Jansma Michel) 
 * @version (2012.11.06)
 */

import java.util.*;
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import java.lang.reflect.*;

public class EventHandler implements ActionListener {
    
    //Instantie variabelen definiëren
    private JFrame     frame;
    private Container  pane;
    private String     handler;
    private Method     method;
    private HashMap<String, JTextField> params;
    private CanteenSimulation simulation;
    
    /**
     * @method EventHandler
     * @params <String> handler
     * @info   Constructor EventHandler klasse
     */
    public EventHandler(CanteenSimulation simulation, String handler) {
        //Instantie variabele frame instantiëren
        this.frame   = new JFrame(handler);
        //Instantie variabele container instantiëren
        this.pane    = this.frame.getContentPane();
        //Instantie variabele handler initialiseren
        this.handler = handler;
        //Instantie variabele simulation initialiseren
        this.simulation = simulation;
    }
    
    /**
     * @method EventHandler
     * @params <String> handler, HashMap<String, JTextField> params
     * @info   !_OVERLOADED Constructor EventHandler klasse
     */
    public EventHandler(CanteenSimulation simulation, String handler, HashMap<String, JTextField> params) {
        //Voer parent constructor uit met 1 parameter
        this(simulation, handler);
        //Instantie variabele params initialiseren
        this.params = params;
    }
    
    /**
     * @method actionPerformed
     * @params <ActionEvent> event
     * @info   Methode, welke dynamische event handeling uitvoerd obv. <String> methode naam
     * @return null
     */
    @Override
    public void actionPerformed(ActionEvent event) {
        //Probeer methode aan te roepen obv. methode naam
        try {
            //Sla methode op in instantie variabele method
            this.method = this.getClass().getMethod(this.handler);
            //Probeer methode aan te roepen
            this.method.invoke(this);
        } catch(Exception e) {
            //Methode kan niet aangeroepen worden
            System.out.println("Handler {" + this.handler + "} kan niet aangeroepen worden!");
        }
    }

    /**
     * @method addArticlePane
     * @params null
     * @info   Maak een (Voeg een artikel toe) frame aan
     * @return null
     */
    public void addArticlePane() {
        
        this.pane.setLayout(new GridLayout());
        this.pane.add(new JLabel("Artikel toevoegen"));
        
        JTextField amount  = new JTextField("100");
        JTextField article = new JTextField("Naam");
        JTextField price   = new JTextField("0.25");
        JButton    submit  = new JButton("Bevestigen");
        
        //Params 
        HashMap<String, JTextField> params = new HashMap<String, JTextField>();
        params.put("amount",  amount );
        params.put("price",   price  );
        params.put("article", article);
       
        submit.addActionListener(new EventHandler(this.simulation, "addArticle", params));
       
        //Add fields
        for(Map.Entry entry : params.entrySet()) {
             this.pane.add((JTextField)entry.getValue());
        }
        this.pane.add(submit);
        
        //Show frame
        this.frame.pack();
        this.frame.setVisible(true);
    }
    
    /**
     * @method addArticle
     * @params null
     * @info   Voeg artikel toe aan kantine aanbod
     * @return null
     */
    public void addArticle() {
        //Probeer artikel toe te voegen
        try {
            //Artikel waardes
            String article = this.params.get("article").getText();
            double price   = Double.parseDouble(this.params.get("price").getText());
            int amount     = Integer.parseInt(this.params.get("amount").getText());
            //Voeg artikel toe
            this.simulation.getSupply().addNewArticle(article, price, amount);
            //Artikel is succesvol toegevoegd
            System.out.println("Artikel is toegevoegd");
        //Artikel kan niet toegevoegd worden
        } catch(Exception exception) {
            System.out.println("Artikel kan niet toegevoegd worden, probeer het opnieuw");
        }
    }
    
    /**
     * @method simulateCanteen
     * @params null
     * @info   Run kantine simulatie
     * @return null
     */
    public void simulateCanteen() {
        if(this.simulation.getSupply().getSupplySize() > 0) {
            System.out.println("Start simulatie");
            this.simulation.simuleer(Integer.parseInt(this.params.get("days").getText()));
        } else {
            System.out.println("Kantine simulatie kan niet gestart worden. Wellicht dat het werkt, wanneer u artikelen toevoegd aan het kantine aanbod");
        }
    }
    
    /**
     * @method test2
     * @params null
     * @info   Test event handler
     * @return null
     */
    public void test2() {
        this.pane.add(new JLabel("Testing"));
        this.frame.pack();
        this.frame.setVisible(true);
    }
    
}
